MIG = Multi Instance GPU
gi = GPU Instance \(\rightarrow\) 가상의 GPU
nvidia-smi mig \(\rightarrow\) 도움말 보기
1. MIG
A. MIG 모드 enable
-
root 획득
sudo -i
\(\rightarrow\) 관리자 권한 획득
-
모든 GPU enable
nvidia-smi -mig 1
sudo systemctl stop nvidia-mig-manager.service
sudo systemctl disable nvidia-mig-manager.service
reboot
nvidia-smi -mig 1
\(\rightarrow\) 여기서 1은 모든 GPU를 의미하는 듯? 즉, 모든 GPU를 mig 모드로 하겠다는 뜻
\(\rightarrow\) mig 모드 해서 GPU를 나누지 않아도 사용하기 때문에, mig 모드 다 해놔도 괜찮~
-
모든 특정 GPU만 enable
#nvidia-smi -i {GPUdev-ID} -mig 1
nvidia-smi -i 0 -mig 1
sudo systemctl stop nvidia-mig-manager.service
sudo systemctl disable nvidia-mig-manager.service
reboot
\(\rightarrow\) 왜인진 모르지만.. 위 sudo~ 를 실행해주어야 함..
-
GPU가 MIG 모드로 되면 아래와 같이 GPU-Util 에 N/A
로 표시된다. 아래는 0,1,2,4 에 대응하는 GPU가 MIG모드로 설정된 상태임
\(\rightarrow\) 여기에 0,1,2,4의 GPU가 있고, 3은 아님. GPU를 gi로 나누면 MIG deviced에 나타남.
\(\rightarrow\) 단, 나중에 이 4의 GPU는 3으로 보고 gi 만들어야 함.
B. GPU, GI, CI 확인
-
용어정리
- GPU: 말 그대로 GPU
- GI: GPU INSTANCE, 하나의 GPU에 여러개의 GPU INSTANCE가 존재할 수 있음.
- CI: COMPUTE INSTANCE, 하나의 GPU INSTANCE에 여러개의 COMPUTE INSTANCE를 만들 수 있음.
-
상황확인
nvidia-smi
-
GPU의 해석
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA A100-SXM... On | 00000000:01:00.0 Off | On |
| N/A 37C P0 53W / 275W | 0MiB / 81251MiB | N/A Default |
| | | Enabled |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA A100-SXM... On | 00000000:47:00.0 Off | On |
| N/A 38C P0 52W / 275W | 0MiB / 81251MiB | N/A Default |
| | | Enabled |
+-------------------------------+----------------------+----------------------+
| 2 NVIDIA A100-SXM... On | 00000000:81:00.0 Off | On |
| N/A 37C P0 54W / 275W | 0MiB / 81251MiB | N/A Default |
| | | Enabled |
+-------------------------------+----------------------+----------------------+
| 3 NVIDIA DGX Display On | 00000000:C1:00.0 Off | N/A |
| 36% 39C P8 N/A / 50W | 1MiB / 3911MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 4 NVIDIA A100-SXM... On | 00000000:C2:00.0 Off | On |
| N/A 37C P0 55W / 275W | 0MiB / 81251MiB | N/A Default |
| | | Enabled |
+-------------------------------+----------------------+----------------------+
총 4개의 GPU가 있으며 아이디는 0,1,2,4 임을 알 수 있다.
-
GPUdev-ID
, GI-ID
, CI-ID
, MIGdev-ID
확인
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 1 0 0 0 | 0MiB / 81251MiB | 98 0 | 7 0 5 1 1 |
| | 1MiB / 13107... | | |
+------------------+----------------------+-----------+-----------------------+
| 2 0 0 0 | 0MiB / 81251MiB | 98 0 | 7 0 5 1 1 |
| | 1MiB / 13107... | | |
+------------------+----------------------+-----------+-----------------------+
아래와 같은 상황을 유추할 수 있다.
GPUdev ID | GI ID | CI ID | MIGdev ID |
---|---|---|---|
1 | 0 (80G) | 0 (98SM) | 0 |
2 | 0 (80G) | 0 (98SM) | 0 |
-
생성가능한 gi 확인
-
생성가능한 ci 확인
\(\rightarrow\) cgi = create GPU Instance
\(\rightarrow\) lgip = list of GPU Instance Profiles
C. GI 생성
-
GPUdev
= 4 에서 생성가능한 GI
조회
#nvidia-smi mig -i {GPUdev-ID} -lgip
nvidia-smi mig -i 4 -lgip
-
아래에 해당하는 GI
를 2개 생성하고 싶다고 하자. (GPU-INSTANCE-PROFILE-ID
=9 임을 유의)
+-----------------------------------------------------------------------------+
| GPU instance profiles: |
| GPU Name ID Instances Memory P2P SM DEC ENC |
| Free/Total GiB CE JPEG OFA |
|=============================================================================|
| 4 MIG 3g.40gb 9 0/2 39.50 No 42 2 0 |
| 3 0 0 |
+-----------------------------------------------------------------------------+
#nvidia-smi mig -i {GPUdev-ID} -cgi {GPU-INSTANCE-PROFILE-ID}
nvidia-smi mig -i 4 -cgi 9
nvidia-smi mig -i 4 -cgi 9
2개까지는 잘 만들어지고 그 이후에는 리소스부족으로 에러발생
-
만들어진 GI
확인
-
생성가능한 CI
확인
nvidia-smi mig -lcip
- Note: {GPU ID: GPU INSTANCE ID} 의 조합에서 {1:0}, {2:0}, {4:1}, {4:2}에 해당하는 GI에서 생성가능한 CI들이 각각 출력된다. 4번 GPU의 GI들은 40기가가 한계이므로 생성가능 CI목록이 상대적으로 제한적임을 캐치하라
D. CI 생성
-
GPUdev
=4 에서 생성가능한 CI
조회
#nvidia-smi mig -i {GPU ID} -lcip
nvidia-smi mig -i 4 -lcip
- Note: 각 GPU-인스턴스(GI)에서는 3개 계산-인스턴스(CI)를 만들수 있음. 만약에
Profile ID = 0
으로 만든다면 14의 계산능력을 가진 CI를 3개까지 만들수 있음, 만약Profile ID = 2*
로 만든다면 42개의 계산능력을 가진 CI를 1개만 만들 수 있음
-
{GPUdev-ID
:GI-ID
} = {4:1} 에서 COMPUTE-INSTANCE-PROFILE-ID
=0 에 해당하는 CI를 3개 생성
#nvidia-smi mig -i {GPUdev-ID} -gi {GI-ID} -cci {COMPUTE-INSTANCE-PROFILE-ID}
nvidia-smi mig -i 4 -gi 1 -cci 0
- Note: 자원부족으로 3개까지 밖에 못만든다..
-
{GPUdev-ID
:GI-ID
}={4:2} 에서 COMPUTE-INSTANCE-PROFILE-ID
=2 에 해당하는 CI를 1개 생성
#nvidia-smi mig -i {GPUdev-ID} -gi {GI-ID} -cci {COMPUTE-INSTANCE-PROFILE-ID}
nvidia-smi mig -i 4 -gi 2 -cci 2
- Note: 자원이 부족해서 1개밖에 못 만든다.
-
현재 상황
GPUdev ID | GI ID | CI ID | MIGdev ID |
---|---|---|---|
1 | 0 (80G) | 0 (98SM) | 0 |
2 | 0 (80G) | 0 (98SM) | 0 |
4 | 1 (80G) | 0 (14SM) | 0 |
4 | 1 (80G) | 1 (14SM) | 1 |
4 | 1 (80G) | 2 (14SM) | 2 |
4 | 2 (80G) | 0 (42SM) | 3 |
2. DOCKER
A. 컨테이너 생성
-
아래와 같은 방식으로 컨테이너 생성
# nvidia-docker run --gpus '"device={GPUdev-ID}:{MIGdev-ID}"' -ti --rm -d -t -p {HOST-PORT}:{CONTAINER-PORT} {DOCKER-IMAGE-NAME} /bin/bash
nvidia-docker run --gpus '"device=1:0"' -ti --rm -d -t -p 7749:7749 -p 1307:1307 ubuntu /bin/bash
nvidia-docker run --gpus '"device=2:0"' -ti -d -t -p 4653:4653 -p 1212:1212 -p 1213:1213 -p 1214:1214 ubuntu /bin/bash
-ti
: 컨테이너를 대화형(interactive) 모드로 실행. 이 모드에서 컨테이너와 상호작용할 수 있음.--rm
: 컨테이너가 종료되면 자동으로 컨테이너를 삭제. 이 옵션을 사용하면 컨테이너를 실행한 후 자동으로 정리.-d
: 컨테이너를 백그라운드(background) 모드로 실행. 이 옵션을 사용하면 컨테이너가 백그라운드에서 실행되며 터미널이 차지되지 않음.-t
: 컨테이너에 tty (터미널)를 할당. 이것은 대화형 모드와 함께 사용./bin/bash
: 컨테이너가 시작될 때 실행할 명령어. 이 경우, Bash 셸을 실행.
docker start\(\rightarrow\) DOCKER 시작
docker ps\(\rightarrow\) 실행중인 DOCKER container list, ps = process status
docker ps -a\(\rightarrow\) 실행중인 DOCKER container list + stop된 container까지 모두
docker image ls\(\rightarrow\) 다운로드한 이미지 목록
nvidia-docker run --gpus '"device=2:0"' -ti -d -t -p 4653:4653 -p 1212:1212 ubuntu /bin/bash
\(\rightarrow\) gpus 플래그라고 하는데 잘 모르겠음..
\(\rightarrow\) device에서 2번 ID의 0번 gi를 의미함
B. 컨테이너 실행
docker exec -ti {CONTAINER-ID} bash
여기에서
{CONTAINER-ID}
는docker ps
혹은docker ps -a
로 확인한다.
3. UBUNTU
A. passwd
-
아래를 실행하여 비밀번호를 바꿀것
passwd root
B. update
-
아래를 실행
apt update
apt install gcc
apt install build-essential
업데이트 해야 vim
설치 되더라구
C. 쓸만한 패키지 설치
-
아래를 설치하면 좋음..
apt install vim
apt install openssh-server
apt install git
D. ssh
# apt install openssh-server
vi /etc/ssh/sshd_config
Port {My-SSH-Port}
PermitRootLogin yes
PasswordAuthentication yes
service ssh restart
vi는 에디터임, i
누르면 수정하는 거고 esc
누르면 나옴.
shift
+ ;
로 :
만들면 text 작성 칸 나오는데, q
하면 나오기 wq
하면 저장하고 나오기 q!
하면 강제 종료하기 임
수정하고 그냥 q
하려하면 안 나와진다.
E. anaconda
-
여기참고..
F. vscode
-
아래를 이용하여 설치
curl -Lk 'https://code.visualstudio.com/sha/download?build=stable&os=cli-alpine-x64' --output vscode_cli.tar.gz
tar -xf vscode_cli.tar.gz
-
아래를 이용하여 초기 설정 (깃헙아이디로 인증)
./code tunnel
-
초기설정 이후 아래를 이용하여 백그라운드에서 실행
nohup ./code tunnel &
G. Jupyter
-
암호설정: 여기로..
-
주피터 실행할때 아래로 실행
jupyter lab --ip="0.0.0.0" --port={MY-PORT} --no-browser --allow-root